package com.yinxin.proxy;

import com.yinxin.proxy.entity.Singer;
import com.yinxin.proxy.entity.ZhangJie;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author yinxin
 * @version 1.0
 * @Description: 动态代理的实现
 * @date 2022/2/2410:25
 */
//首先实现一个InvocationHandler，方法调用会被转发到该类的invoke()方法。
public class LogInvocationHandler implements InvocationHandler {

    public Singer singer;

    public LogInvocationHandler(Singer singer) {
        this.singer = singer;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] args) throws Throwable {
        //当代理对象嗲用say方法时候触发
        Object invoke;
        if("sing".equals(method.getName())){
            //对sing方法的增强
            System.out.println("动态代理开始");
            invoke = method.invoke(singer, args);
            System.out.println("动态代理结束");
        }else {
            invoke = method.invoke(singer, args);
        }
        return invoke;
    }

    // 这里为了方便就在这个类中写主启动类测试
    public static void main(String[] args) {
        Singer zhangJie = new ZhangJie("歌词");
        Singer zjproxy = (Singer) Proxy.newProxyInstance(
                zhangJie.getClass().getClassLoader(),//类加载器
                new Class<?>[]{Singer.class},//代理需要实现的接口可以多个
                new LogInvocationHandler(zhangJie)//方法的实际处理者
        );
        zjproxy.sing();
    }
}
